<?php
def("amicitia/arquitectura/anotacion/","Anotacion");

/**
 * Clase encargada de interpretar anotaciones en otras clases mediante
 * Reflection.
 * 
 * Ejemplo de anotaciónes:
 * @)Seguridad(rol = admin, nivel=2)
 * @)Prioridad( alta )
 * @)Persistente
 * @)Preprocesos(crear,  asegurar, interpretar  ,orden = 1)
 * 
 * @author Willy A. Kuster
 */
class AnotacionParser {
	
	private $reflectionObject;
	private $anotaciones = array();
	
	public function __construct(Reflector $reflectionObject){
		$this->reflectionObject = $reflectionObject;
		$comentarios = $reflectionObject->getDocComment();
		
		$anotacionMatches = array();
		$anotacionResult = preg_match_all("/@\)([\w]+)([ ]*\((.+?)\))?/", $comentarios, $anotacionMatches, PREG_SET_ORDER);
		
		foreach($anotacionMatches as $anotacionMatch){
			$nombreAnotacion = $anotacionMatch[1];
			if(!isset($anotacionMatch[3])){
				$this->anotaciones[$nombreAnotacion] = new Anotacion($nombreAnotacion);
			} else {
				$args = $anotacionMatch[3];
				
				$argsMatches = array();
				$argsResult = preg_match_all("/[ ]*([\w]+)[ ]*=[ ]*([\w]+)[ ]*|[ ]*([\w]+)[ ]*/",$args,$argsMatches,PREG_SET_ORDER);
				
				$anotacion = new Anotacion($nombreAnotacion);
				foreach($argsMatches as $argMatch){
					if(!isset($argMatch[3])){
						$nombre = $argMatch[1];
						$valor = $argMatch[2];
						$anotacion->__set($nombre,$valor);
					} else {
						$valor = $argMatch[3];
						$anotacion->addValorSingular($valor);
					}
				}
				$this->anotaciones[$nombreAnotacion] = $anotacion;
			}
		}
	}
	
	public function obtenerAnotacion($nombreAnotacion) {
		return $this->anotaciones[$nombreAnotacion];
	}
	
	public function obtenerAnotaciones() {
		return $this->anotaciones;
	}
	
	public function existeAnotacion($nombreAnotacion) {
		return array_key_exists($nombreAnotacion,$this->anotaciones);
	}
}
?>